<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
<!-- 
    JS使用的是静态作用域（词法作用域）
    静态作用域在词法分析阶段已经确定了作用域链
    静态作用域主要关注的是函数在哪定义，与在哪调用无关
    动态作用域，主要关注的是函数在哪调用，与函数在哪定义无关

    JS中的小括号
    1.小括号用于分组 (2+3)*4  (123).toString()
    2.小括号用于调用函数 fn();

    立即执行函数（自执行函数）IIFE
    (function (){})();
    (function (){})小括号的作用是分组
    ()小括号的作用是调用函数
    立即执行函数的各种写法：
    (function (){})();
    (function (){}());
    !function (){}();
    +function (){}();
    -function (){}();
    使用立即执行函数的主要目的：提供一个独立的作用域

    回调函数 callback cb
    把一个函数作为参数传入到另一个函数内部调用时，我们称该函数为 回调函数
    function f1(cb){
        cb();
    }
    function f2(){} 回调函数
    f1(f2);

    递归函数
    一个函数直接或间接调用自己，该函数称为 递归函数
    递归函数三个阶段：递归前进段、出口条件、递归返回段
    递归的本质是函数循环调用
    function f(n){
        // 终止条件
        if (n == 1){
            return 16;
        }
        return f(n-1)-2;
    }

    构造函数（相当于其他语言类，JS中没有类）
    当一个函数用于创建特定类型的实例对象，并且使用new调用的函数就叫构造函数
    构造函数通常首字母大写
    通常在构造函数内部给this添加属性方法
    function Human(){
        this.name = '海静';
    }

    this是一个关键字，是一个指针型变量
    1.在全局访问this时，指向window对象
    console.log(this); // window
    2.通常在函数中访问this，this指向函数的调用者（谁调用就指向谁）
    function fn(){
        // 定义函数时，this并不能确定指向，调用函数时才能确定指向
        console.log(this);
    }
    3.在构造函数中，this指向创建出来的实例对象
 -->

</body>
</html>